#include <iostream>
#include "Server.hpp"
#include "Command.hpp"
#include "Calculator.hpp"
#include "Protocol.hpp"
#include "Daemon.hpp"
// version_3 封装进Prase类中
using cal_func = std::function<Response(Request &)>;
class Prase
{
public:
    Prase(cal_func cal) : _cal(cal)
    {
    }

    std::string Entry(std::string &package)
    {
        // 1.解包
        std::string content;
        std::string respstr;
        while (Decode(package, &content))
        {
            // 2.反序列化
            Request req;
            // 格式可能不对,直接丢弃报文
            if (!req.Deserialize(content))
            {
                break;
            }
            // 3.计算
            Response resp = _cal(req);
            // 4.序列化
            std::string message;
            if (!resp.Serialize(message))
            {
                return "";
            }
            // 5.Encode
            if (!Encode(message))
            {
                return "";
            }
            respstr += message;
        }

        return respstr;
    }

private:
    cal_func _cal;
};
// version_2 一次可以处理多个报文
//  Calculator gcal;
//  std::string Entry(std::string &package)
//  {
//      // 1.解包
//      std::string content;
//      std::string respstr;
//      while (Decode(package, &content))
//      {
//          // 2.反序列化
//          Request req;
//          // 格式可能不对,直接丢弃报文
//          if (!req.Deserialize(content))
//          {
//              break;
//          }
//          // 3.计算
//          Response resp = gcal.Execute(req);
//          // 4.序列化
//          std::string message;
//          if (!resp.Serialize(message))
//          {
//              return "";
//          }
//          // 5.Encode
//          if (!Encode(message))
//          {
//              return "";
//          }
//          respstr+=message;
//      }

//     return respstr;
// }
// version_1 一次只能处理一个报文
//  Calculator gcal;
//  std::string Entry(std::string& package)
//  {
//      //1.解包
//      std::string content;
//      if(!Decode(package,&content))
//      {
//          return "";
//      }
//      //2.反序列化
//      Request req;
//      //格式可能不对,直接丢弃报文
//      if(!req.Deserialize(content))
//      {
//          return "";
//      }
//      //3.计算
//      Response resp = gcal.Execute(req);
//      //4.序列化
//      std::string message;
//      if(!resp.Serialize(message))
//      {
//          return "";
//      }
//      //5.Encode
//      if(!Encode(message))
//      {
//          return "";
//      }
//      return message;
//  }
int main()
{
    ENABLE_FILE();
    // Command cmd;
    Daemon(false,false);
    //1.计算模块
    Calculator cal;
    //2.解析模块
    Prase prase([&cal](Request& req)->Response{
        return cal.Execute(req);
    });
    //3.网络通信  IO
    Server server([&prase](std::string &package) -> std::string
                  { return prase.Entry(package); });
    server.InitServer();
    server.Start();
    return 0;
}